iT邦幫忙

2022 iThome 鐵人賽

DAY 21
0
Modern Web

淺入淺出 Rails with Vue系列 第 21

【Day 21】淺入淺出 Rails with Vue - Vue 的基本概念 - 20

  • 分享至 

  • xImage
  •  

前言

本系列將介紹 Rails with Vue 的基本概念,並且以一個簡單的專案 Todo 來說明如何使用 Rails with Vue。我將透過這一系列的文章記錄我學習的過程,並且將我所學到的知識分享給大家。

Components Basics

Dynamic Components

有時候我們會需要動態的切換元件,像是以下範例的 tab 頁籤,我們希望透過點擊不同的 tab (button) 來切換不同的元件。

<div id="dynamic-component-demo" class="demo">
  <button
    class="dynamic-component-demo-tab-button dynamic-component-demo-tab-button-active"
  >
    Home</button
  ><button class="dynamic-component-demo-tab-button">Posts</button
  ><button class="dynamic-component-demo-tab-button">Archive</button>
  <div class="dynamic-component-demo-tab">Home component</div>
</div>

像是這樣的 use case,我們可以透過 v-bind:is 來切換元件,如以下範例中,我們可以透過 currentTabComponent 來切換不同的元件。

<component v-bind:is="currentTabComponent"></component>

這個 currentTabComponent 可以是以下兩種:

  1. 一個元件的名稱
  2. 一個元件的 options object

一個元件的名稱

如以下範例中 currentTabComponent 代表的就是元件的名稱,像是 tab-hometab-poststab-archive
當使用者點擊不同的 tab (button) 時,執行的流程如下,

  1. 將物件的名稱傳給 currentTab 這個變數
  2. 在 root component 中,當 currentTab 變數改變時,computed 屬性 currentTabComponent 也會跟著改變
  3. currentTabComponent 改變時,會重新 render 一次,並且將 currentTabComponent 的值傳給 v-bind:is,這時候就會切換不同的元件
<div id="dynamic-component-demo" class="demo">
  <button
    v-for="tab in tabs"
    v-bind:key="tab"
    v-bind:class="['tab-button', { active: currentTab === tab }]"
    v-on:click="currentTab = tab"
  >
    {{ tab }}
  </button>

  <component v-bind:is="currentTabComponent" class="tab"></component>
</div>
Vue.component("tab-home", {
  template: "<div>Home component</div>"
});
Vue.component("tab-posts", {
  template: "<div>Posts component</div>"
});
Vue.component("tab-archive", {
  template: "<div>Archive component</div>"
});

new Vue({
  el: "#dynamic-component-demo",
  data: {
    currentTab: "Home",
    tabs: ["Home", "Posts", "Archive"]
  },
  computed: {
    currentTabComponent: function() {
      return "tab-" + this.currentTab.toLowerCase();
    }
  }
});

一個元件的 options object

如以下範例中 currentTab.component 代表的就是元件的 options object,會對應到 tabs 陣列中的某一個 object 的 component 屬性。
當使用者點擊不同的 tab (button) 時,執行的流程如下,

  1. 將 tabs 陣列中對應的 object 傳給 currentTab 這個變數
  2. 在 root component 中,當 currentTab 變數改變時,會重新 render 一次,並且將 currentTab.component 的值傳給 v-bind:is,這時候就會切換不同的元件
<div id="dynamic-component-demo" class="demo">
  <button
    v-for="tab in tabs"
    v-bind:key="tab.name"
    v-bind:class="['tab-button', { active: currentTab.name === tab.name }]"
    v-on:click="currentTab = tab"
  >
    {{ tab.name }}
  </button>

  <component v-bind:is="currentTab.component" class="tab"></component>
</div>
var tabs = [
  {
    name: "Home",
    component: {
      template: "<div>Home component</div>",
    },
  },
  {
    name: "Posts",
    component: {
      template: "<div>Posts component</div>",
    },
  },
  {
    name: "Archive",
    component: {
      template: "<div>Archive component</div>",
    },
  },
];

new Vue({
  el: "#dynamic-component-demo",
  data: {
    tabs: tabs,
    currentTab: tabs[0],
  },
});

Reference


上一篇
【Day 20】淺入淺出 Rails with Vue - Vue 的基本概念 - 19
下一篇
【Day 22】淺入淺出 Rails with Vue - Vue 的基本概念 - 21
系列文
淺入淺出 Rails with Vue30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言